From 331ab6997d8133f2c151414686d54639d86032c4 Mon Sep 17 00:00:00 2001 From: oliskoli Date: Sun, 17 Aug 2008 20:52:22 +0000 Subject: [PATCH] parse: Add function global function parse_date. --- defs.h | 1 + parse.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/defs.h b/defs.h index c4ded48de..03c2ec2df 100644 --- a/defs.h +++ b/defs.h @@ -958,6 +958,7 @@ int parse_coordinates(const char *str, int datum, const grid_type grid, double *latitude, double *longitude, const char *module); int parse_distance(const char *str, double *val, double scale, const char *module); int parse_speed(const char *str, double *val, const double scale, const char *module); +time_t parse_date(const char *str, const char *format, const char *module); /* * From util_crc.c diff --git a/parse.c b/parse.c index e6ee8b44a..d0217c4a4 100644 --- a/parse.c +++ b/parse.c @@ -20,14 +20,16 @@ */ -#include "defs.h" -#include "jeeps/gpsmath.h" #include #include #include #include #include +#include "defs.h" +#include "jeeps/gpsmath.h" +#include "strptime.h" + /* * parse_distance: * @@ -235,3 +237,54 @@ parse_coordinates(const char *str, int datum, const grid_type grid, return result; } + + +time_t +parse_date(const char *str, const char *format, const char *module) +{ + struct tm tm; + + memset(&tm, 0, sizeof(tm)); + + if (format) { + char *cx = strptime(str, format, &tm); + if ((cx != NULL) && (*cx != '\0')) + fatal("%s: Could not parse date string (%s).\n", module, str); + } + else { + int p1, p2, p3, ct; + char sep[2]; + + ct = sscanf(str, "%d%1[-.//]%d%1[-.//]%d", &p1, sep, &p2, sep, &p3); + if (ct != 5) + fatal("%s: Could not parse date string (%s).\n", module, str); + + if ((p1 > 99) || (sep[0] == '-')) { /* Y-M-D (iso like) */ + tm.tm_year = p1; + tm.tm_mon = p2; + tm.tm_mday = p3; + } + else if (sep[0] == '.') { /* Germany and any other countries */ + tm.tm_mday = p1; /* have a fixed D.M.Y format */ + tm.tm_mon = p2; + tm.tm_year = p3; + } + else { + tm.tm_mday = p2; + tm.tm_mon = p1; + tm.tm_year = p3; + } + if ((p1 < 100) && (p2 < 100) && (p3 < 100)) { + if (tm.tm_year < 70) tm.tm_year += 2000; + else tm.tm_year += 1900; + } + /* some low-level checks */ + if ((tm.tm_mon > 12) || (tm.tm_mon < 1) || (tm.tm_mday > 31) || (tm.tm_mday < 1)) + fatal("%s: Could not parse date string (%s).\n", module, str); + + tm.tm_year -= 1900; + tm.tm_mon -= 1; + } + + return mkgmtime(&tm); +} -- 2.30.2